package br.com.petsis.funcionalidades.manterIndicadores;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;

import br.com.petsis.entity.Cliente;
import br.com.petsis.entity.Perfil;
import br.com.petsis.entity.Produto;
import br.com.petsis.entity.Servico;
import br.com.petsis.vo.IndicadorClientes;
import br.com.petsis.vo.IndicadorProdutos;
import br.com.petsis.vo.IndicadorServicos;

@Name("manterIndicadoresController")
@Scope(ScopeType.CONVERSATION)
@Restrict(value="#{!identity.hasRole('"+Perfil.PERFIL_VETERINARIA+"')}")
public class ManterIndicadoresController {
	
	private static final String QRY_PRODUTOS = "SELECT COUNT(ID_PEDIDO_PRODUTO) as QUANTIDADE," +
			"p.ID_PRODUTO " +
			"FROM pedido_produto p " +
			"INNER JOIN pedido pe " +
			"on p.ID_PEDIDO = pe.ID_PEDIDO " +
			"WHERE pe.DTA_PEDIDO >= :dtaInicio AND " +
			"pe.DTA_PEDIDO <= :dtaFim " +
			"group by ID_PRODUTO " +
			"order by QUANTIDADE DESC " +
			"LIMIT 0,10;";
	
	private static final String QRY_PRODUTOS_TOTAL = "SELECT COUNT(ID_PEDIDO_PRODUTO) as QUANTIDADE " +
			"FROM pedido_produto p " +
			"INNER JOIN pedido pe " +
			"on p.ID_PEDIDO = pe.ID_PEDIDO " +
			"WHERE pe.DTA_PEDIDO >= :dtaInicio AND " +
			"pe.DTA_PEDIDO <= :dtaFim";
			
	
	private static final String QRY_SERVICOS = "SELECT COUNT(ID_PEDIDO_SERVICO) as QUANTIDADE,"+
			"p.ID_SERVICO "+
			"FROM pedido_servico p "+
			"INNER JOIN pedido pe " +
			"on p.ID_PEDIDO = pe.ID_PEDIDO " +
			"WHERE pe.DTA_PEDIDO >= :dtaInicio AND " +
			"pe.DTA_PEDIDO <= :dtaFim " +
			"group by ID_SERVICO "+
			"order by QUANTIDADE DESC "+
			"LIMIT 0,10;";
	
	private static final String QRY_SERVICOS_TOTAL = "SELECT COUNT(ID_PEDIDO_SERVICO) as QUANTIDADE "+
			"FROM pedido_servico p "+
			"INNER JOIN pedido pe " +
			"on p.ID_PEDIDO = pe.ID_PEDIDO " +
			"WHERE pe.DTA_PEDIDO >= :dtaInicio AND " +
			"pe.DTA_PEDIDO <= :dtaFim";
	
	private static final String QRY_CLIENTES = "SELECT COUNT(ID_PEDIDO) AS QUANTIDADE," +
			"p.ID_CLIENTE " +
			"FROM pedido p " +
			"WHERE p.DTA_PEDIDO >= :dtaInicio " +
			"AND p.DTA_PEDIDO <= :dtaFim " +
			"GROUP BY p.ID_CLIENTE " +
			"ORDER BY QUANTIDADE DESC LIMIT 0,10;";
	
	private static final String QRY_CLIENTES_TOTAL = "SELECT COUNT(ID_PEDIDO) AS QUANTIDADE " +
			"FROM pedido p " +
			"WHERE p.DTA_PEDIDO >= :dtaInicio " +
			"AND p.DTA_PEDIDO <= :dtaFim";
	
	private static final String PARAMETER_DTA_INICIO = "dtaInicio";
	private static final String PARAMETER_DTA_FIM = "dtaFim";

	@In(create=true)
	private EntityManager entityManager;
	
	private Date dataInicio;
	
	private Date dataFim;
	
	private List<IndicadorProdutos> listaIndicadorProdutos;
	
	private List<IndicadorServicos> listaIndicadorServicos;
	
	private List<IndicadorClientes> listaIndicadorClientes;
	
	public void geraEstatiticas(){
		List<Object[]> resultProdutos = entityManager.createNativeQuery(QRY_PRODUTOS)
			.setParameter(PARAMETER_DTA_INICIO, getDataInicio())
			.setParameter(PARAMETER_DTA_FIM, getDataFim())
			.getResultList();
		
		List<Object[]> resultServicos = entityManager.createNativeQuery(QRY_SERVICOS)
			.setParameter(PARAMETER_DTA_INICIO, getDataInicio())
			.setParameter(PARAMETER_DTA_FIM, getDataFim())
			.getResultList();
		
		List<Object[]> resultClientes = entityManager.createNativeQuery(QRY_CLIENTES)
			.setParameter(PARAMETER_DTA_INICIO, getDataInicio())
			.setParameter(PARAMETER_DTA_FIM, getDataFim())
			.getResultList();
		
		BigInteger totalProdutos = (BigInteger)entityManager.createNativeQuery(QRY_PRODUTOS_TOTAL)
			.setParameter(PARAMETER_DTA_INICIO, getDataInicio())
			.setParameter(PARAMETER_DTA_FIM, getDataFim())
			.getSingleResult();
		
		BigInteger totalServicos = (BigInteger)entityManager.createNativeQuery(QRY_SERVICOS_TOTAL)
			.setParameter(PARAMETER_DTA_INICIO, getDataInicio())
			.setParameter(PARAMETER_DTA_FIM, getDataFim())
			.getSingleResult();
		
		BigInteger totalClientes = (BigInteger)entityManager.createNativeQuery(QRY_CLIENTES_TOTAL)
			.setParameter(PARAMETER_DTA_INICIO, getDataInicio())
			.setParameter(PARAMETER_DTA_FIM, getDataFim())
			.getSingleResult();
		
		IndicadorProdutos indicadorProdutos;
		IndicadorServicos indicadorServicos;
		IndicadorClientes indicadorClientes;
		
		for(Object[] o1 : resultProdutos){
			indicadorProdutos = new IndicadorProdutos();
			indicadorProdutos.setPosicao(getListaIndicadorProdutos().size() + 1);
			indicadorProdutos.setQuantidade(((BigInteger)o1[0]).intValue());
			indicadorProdutos.setProduto(entityManager.find(Produto.class, (Integer)o1[1]));
			Float quant = new Float(indicadorProdutos.getQuantidade());
			Float total = new Float(totalProdutos.intValue());
			Float percent = quant/total*new Float(100);
			indicadorProdutos.setPercentual(percent.intValue());
			getListaIndicadorProdutos().add(indicadorProdutos);
		}
		
		for(Object[] o1 : resultServicos){
			indicadorServicos = new IndicadorServicos();
			indicadorServicos.setPosicao(getListaIndicadorServicos().size() + 1);
			indicadorServicos.setQuantidade(((BigInteger)o1[0]).intValue());
			indicadorServicos.setServico(entityManager.find(Servico.class, (Integer)o1[1]));
			Float quant = new Float(indicadorServicos.getQuantidade());
			Float total = new Float(totalServicos.intValue());
			//Float dividido = quant/total;
			Float percent = quant/total*new Float(100);
			indicadorServicos.setPercentual(percent.intValue());
			getListaIndicadorServicos().add(indicadorServicos);
		}
		
		for(Object[] o1 : resultClientes){
			indicadorClientes = new IndicadorClientes();
			indicadorClientes.setPosicao(getListaIndicadorClientes().size() + 1);
			indicadorClientes.setQuantidade(((BigInteger)o1[0]).intValue());
			indicadorClientes.setCliente(entityManager.find(Cliente.class, (Integer)o1[1]));
			Float quant = new Float(indicadorClientes.getQuantidade());
			Float total = new Float(totalClientes.intValue());
			Float percent = quant/total*new Float(100);
			indicadorClientes.setPercentual(percent.intValue());
			getListaIndicadorClientes().add(indicadorClientes);
		}
		
	}
	
	public List<IndicadorProdutos> getListaIndicadorProdutos() {
		if (listaIndicadorProdutos == null) {
			listaIndicadorProdutos = new ArrayList<IndicadorProdutos>();
		}
		return listaIndicadorProdutos;
	}

	public void setListaIndicadorProdutos(
			List<IndicadorProdutos> listaIndicadorProdutos) {
		this.listaIndicadorProdutos = listaIndicadorProdutos;
	}

	public List<IndicadorServicos> getListaIndicadorServicos() {
		if (listaIndicadorServicos == null) {
			listaIndicadorServicos = new ArrayList<IndicadorServicos>();
		}
		return listaIndicadorServicos;
	}

	public void setListaIndicadorServicos(
			List<IndicadorServicos> listaIndicadorServicos) {
		this.listaIndicadorServicos = listaIndicadorServicos;
	}

	public List<IndicadorClientes> getListaIndicadorClientes() {
		if (listaIndicadorClientes == null) {
			listaIndicadorClientes = new ArrayList<IndicadorClientes>();
		}
		return listaIndicadorClientes;
	}

	public void setListaIndicadorClientes(
			List<IndicadorClientes> listaIndicadorClientes) {
		this.listaIndicadorClientes = listaIndicadorClientes;
	}

	public Date getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(Date dataInicio) {
		this.dataInicio = dataInicio;
	}

	public Date getDataFim() {
		return dataFim;
	}

	public void setDataFim(Date dataFim) {
		this.dataFim = dataFim;
	}
	
}
